Data specifics

  • The Longitudinal Employer Household Dynamics (LEHD) program at the US Census Bureau releases the Origin Destination Employment Statistis (LODES) datasets annually based on employer-employee insurance records.
  • This data file uses data from the Workplace Area Characteristics (WAC) datafile from LEHD..
  • Data presented here are from 2018 and spatial units are based on the 2010 census. As of July of 2021, 2018 is the most recent year for which data is available. The earliest year for which data is available is 2002.
  • The data contains the number of jobs within a spatial unit (SU), disaggregated by wage earnings, education-attainment of the worker, and race of the worker (all of which were pulled from the WAC data file)
  • Some limitations: jobs counts do not include those working in defense-related industries; the data are prone to imperfect geocoding for certain jobs (jobs for companies with multiple branches are often all coded in the same location); although there are datasets from 2002-2018, these data are not suitable for longitudinal analysis; and student-workers are unlikely to be represented in these data because their jobs are not typically covered by state unemployment insurance.

Variable descriptions

meta %>% 
  filter(su_blkgp == 1) %>%
  select(varname, about) %>% as.list()
## $varname
##  [1] "lowwage_jobs"             "midwage_jobs"            
##  [3] "higwage_jobs"             "alljobs"                 
##  [5] "lowwage_p"                "midwage_p"               
##  [7] "higwage_p"                "White_workers"           
##  [9] "Black_workers"            "AI_Na_workers"           
## [11] "Asian_workers"            "NaH_PI_workers"          
## [13] "Multiracial_workers"      "lessThanHS_jobs"         
## [15] "HSnoCollege_jobs"         "SomeColl_Associates_jobs"
## [17] "Bach_AdvDeg_jobs"         "w_county"                
## [19] "w_blkgroup"               "countyName"              
## 
## $about
##  [1] "Number of low-wage jobs in the su (earnings $1250/month or less)"                    
##  [2] "Number of mid-wage jobs in the su (earnings $1251/month to $3333/month)"             
##  [3] "Number of high-wage jobs in the su (earnings greater than $3333/month)"              
##  [4] "Total number of jobs in the su"                                                      
##  [5] "Number of low-wage jobs in the su divided by the total number of jobs in the su"     
##  [6] "Number of mid-wage jobs in the su divided by the total number of jobs in the su"     
##  [7] "Number of high-wage jobs in the su divided by the total number of jobs in the su"    
##  [8] "Number of White alone workers employed in the su"                                    
##  [9] "Number of Black alone workers employed in the su"                                    
## [10] "Number of American Indian or Alaska Native alone workers employed in the su"         
## [11] "Number of Asian alone workers employed in the su"                                    
## [12] "Number of Native Hawaiian or Other Pacific Islander alone workers employed in the su"
## [13] "Number of workers employed in the su who identify as two or more race groups"        
## [14] "Number of jobs for workers with less than a high school education"                   
## [15] "Number of jobs for workers with a high school education but no college"              
## [16] "Number of jobs for workers with some college or an Associates degree"                
## [17] "Number of jobs for workers with a Bachelor's or advanced degree"                     
## [18] "5-digit county code"                                                                 
## [19] "12-digit census block group code"                                                    
## [20] "County name"
glimpse(lodes)
## Rows: 155
## Columns: 20
## $ w_blkgroup               <dbl> 510030101001, 510030101002, 510030101003, 510…
## $ lowwage_jobs             <int> 44, 81, 49, 48, 118, 33, 37, 205, 14, 440, 20…
## $ midwage_jobs             <int> 58, 83, 63, 73, 177, 40, 96, 157, 52, 783, 49…
## $ higwage_jobs             <int> 41, 55, 60, 258, 181, 39, 108, 90, 63, 1782, …
## $ alljobs                  <int> 143, 219, 172, 379, 476, 112, 241, 452, 129, …
## $ lowwage_p                <dbl> 0.3076923, 0.3698630, 0.2848837, 0.1266491, 0…
## $ midwage_p                <dbl> 0.4055944, 0.3789954, 0.3662791, 0.1926121, 0…
## $ higwage_p                <dbl> 0.2867133, 0.2511416, 0.3488372, 0.6807388, 0…
## $ White_workers            <int> 128, 204, 149, 296, 316, 96, 207, 371, 108, 2…
## $ Black_workers            <int> 12, 11, 13, 55, 115, 10, 26, 64, 19, 354, 12,…
## $ AI_Na_workers            <int> 1, 0, 0, 1, 0, 0, 2, 1, 0, 6, 0, 0, 0, 0, 2, …
## $ Asian_workers            <int> 0, 2, 9, 20, 31, 2, 2, 14, 1, 148, 3, 10, 3, …
## $ NaH_PI_workers           <int> 0, 0, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Multiracial_workers      <int> 2, 2, 0, 6, 12, 2, 4, 2, 1, 46, 3, 0, 2, 4, 7…
## $ lessThanHS_jobs          <int> 20, 25, 17, 34, 42, 17, 25, 38, 16, 217, 11, …
## $ HSnoCollege_jobs         <int> 36, 46, 42, 97, 109, 19, 56, 73, 26, 574, 24,…
## $ SomeColl_Associates_jobs <int> 32, 60, 42, 89, 115, 27, 73, 98, 32, 688, 31,…
## $ Bach_AdvDeg_jobs         <int> 14, 45, 36, 98, 82, 29, 42, 93, 30, 825, 23, …
## $ w_county                 <int> 51003, 51003, 51003, 51003, 51003, 51003, 510…
## $ countyName               <chr> "Albemarle", "Albemarle", "Albemarle", "Albem…
lodes %>% select(lowwage_jobs:Bach_AdvDeg_jobs) %>% 
  select(where(~is.numeric(.x))) %>% 
  as.data.frame() %>% 
  stargazer(., type = "text", title = "Summary Statistics", digits = 2,
            summary.stat = c("mean", "sd", "min", "median", "max"))
## 
## Summary Statistics
## ===========================================================
## Statistic                 Mean  St. Dev. Min  Median  Max  
## -----------------------------------------------------------
## lowwage_jobs             175.44  313.91   1     72   2,352 
## midwage_jobs             238.54  439.40   0     98   3,086 
## higwage_jobs             346.51 1,034.46  0     83   9,734 
## alljobs                  760.49 1,714.50  10   284   14,612
## lowwage_p                 0.29    0.13   0.06  0.29   0.82 
## midwage_p                 0.37    0.10   0.00  0.38   0.70 
## higwage_p                 0.34    0.16   0.00  0.31   0.83 
## White_workers            598.00 1,346.47  1    223   11,566
## Black_workers            118.08  245.58   0     38   1,615 
## AI_Na_workers             2.28    4.59    0     1      37  
## Asian_workers            28.63   105.72   0     6    1,146 
## NaH_PI_workers            0.52    1.41    0     0      11  
## Multiracial_workers      12.98   30.20    0     4     237  
## lessThanHS_jobs          63.95   116.09   0     30    878  
## HSnoCollege_jobs         150.65  287.01   1     64   2,235 
## SomeColl_Associates_jobs 174.17  391.33   0     65   3,072 
## Bach_AdvDeg_jobs         197.86  592.62   0     56   5,950 
## -----------------------------------------------------------

Total jobs counts

lodes %>% select(c(w_blkgroup:alljobs)) %>% 
  pivot_longer(-w_blkgroup, names_to = "measure", values_to = "value") %>% 
  ggplot(aes(x = value, fill = measure)) + 
  scale_fill_viridis(option = "plasma", discrete = TRUE, guide = FALSE) +
  geom_histogram() + 
  facet_wrap(~measure, scales = "free")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

meta %>% 
  filter(varname %in% c("higwage_jobs", "lowwage_jobs", "midwage_jobs", "alljobs")) %>%
  mutate(label = paste0(varname, ": ", about)) %>% 
  select(label) %>% 
  as.list()

$label [1] "lowwage_jobs: Number of low-wage jobs in the su (earnings $1250/month or less)"
[2] "midwage_jobs: Number of mid-wage jobs in the su (earnings $1251/month to $3333/month)" [3] "higwage_jobs: Number of high-wage jobs in the su (earnings greater than $3333/month)" [4] "alljobs: Total number of jobs in the su"

Mapping the data

## [1] TRUE

All jobs

pal <- colorNumeric("plasma", reverse = TRUE, domain = cvl_lodes$alljobs)
leaflet(cvl_lodes) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = cvl_lodes,
              fillColor = ~pal(alljobs),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 1, fillOpacity = 0.8, bringToFront = T
              ),
              popup = paste0("Locality: ", cvl_lodes$countyName, "<br>",
                             "Number of jobs: ", cvl_lodes$alljobs, 2)) %>% 
  addLegend("bottomright", pal = pal, values = cvl_lodes$alljobs, 
            title = "Number of jobs", opacity = 0.7)

Wages

Proportion of low-wage jobs (earnings $1250/month or less) in each SU

pal <- colorNumeric("BuPu", domain = cvl_lodes$lowwage_p)
leaflet(cvl_lodes) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = cvl_lodes,
              fillColor = ~pal(lowwage_p),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              highlight = highlightOptions(
                weight = 1, fillOpacity = 0.8, bringToFront = T
                ),
              popup = paste0("Locality: ", cvl_lodes$countName, "<br>",
               "Prop. low-wage jobs: ", round(cvl_lodes$lowwage_p, 2))) %>% 
  addLegend("bottomright", pal = pal, values = cvl_lodes$lowwage_p, 
            title = "Proportion of <br> low-wage jobs", opacity = 0.7)

Proportion of high-wage jobs (earnings greater than $3333/month) in each SU

pal <- colorNumeric("BuPu", domain = cvl_lodes$higwage_p)
leaflet(cvl_lodes) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = cvl_lodes,
              fillColor = ~pal(higwage_p),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              smoothFactor = 0.3,
              highlight = highlightOptions(
                weight = 1, fillOpacity = 0.8, bringToFront = T
              ),
              popup = paste0("Locality: ", cvl_lodes$countName, "<br>",
                             "Prop. high-wage jobs: ", round(cvl_lodes$higwage_p, 2))) %>% 
  addLegend("bottomright", pal = pal, values = cvl_lodes$higwage_p, 
            title = "Proportion of <br> high-wage jobs", opacity = 0.7)

Education

Number of jobs for college-educated workers in each SU

pal <- colorNumeric("plasma", reverse = TRUE, domain = cvl_lodes$Bach_AdvDeg_jobs)
leaflet(cvl_lodes) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = cvl_lodes,
              fillColor = ~pal(Bach_AdvDeg_jobs),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              smoothFactor = 0.3,
              highlight = highlightOptions(
                weight = 1, fillOpacity = 0.8, bringToFront = T
              ),
              popup = paste0("Locality: ", cvl_lodes$countyName, "<br>",
                             "Number of jobs: ", cvl_lodes$Bach_AdvDeg_jobs)) %>% 
  addLegend("bottomright", pal = pal, values = cvl_lodes$Bach_AdvDeg_jobs, 
            title = "Number of jobs for <br> college-educated workers", opacity = 0.7)

Number of jobs for high school-educated workers in each SU

pal <- colorNumeric("plasma", reverse = TRUE, domain = cvl_lodes$HSnoCollege_jobs)
leaflet(cvl_lodes) %>% 
  addProviderTiles("CartoDB.Positron") %>% 
  addPolygons(data = cvl_lodes,
              fillColor = ~pal(HSnoCollege_jobs),
              weight = 1,
              opacity = 1,
              color = "white", 
              fillOpacity = 0.6,
              smoothFactor = 0.3,
              highlight = highlightOptions(
                weight = 1, fillOpacity = 0.8, bringToFront = T
              ),
              popup = paste0("Locality: ", cvl_lodes$countyName, "<br>",
                             "Number of jobs: ", cvl_lodes$HSnoCollege_jobs)) %>% 
  addLegend("bottomright", pal = pal, values = cvl_lodes$HSnoCollege_jobs, 
            title = "Number of jobs for <br> high school-educated <br> workers", opacity = 0.7)